/**
 * @fileoverview HQ 样式处理
 * @author HQWebGroup
 * @version 1.2
 */
/**
 * 备注:
 * 				直接通过样式表id号获取样式    		取得样式表的寄主
 * IE						是									owningElement
 * Safari					是									ownerNode
 * Opera					否									ownerNode
 * Firefox					否									ownerNode
 */
/**
 * 样式表处理类
 * @namespace 提供多浏览器兼容的样式表处理
 */
HQ.css = {
	/**
	 * 收集className的规则
	 * @param {string} className 样式名称
	 * @private
	 * @ignore
	 * @deprecated 暂时不使用
	 */
	getClassRegEx: function(className){
		var re = HQ.css.classNameCache[className];
		if (!re) {
			re = new RegExp('(?:^|\\s+)' + className + '(?:\\s+|$)');
			HQ.css.classNameCache[className] = re;
		}
		return re;
	},
	
	/**
	 * 把16进制的颜色转换成10进制颜色
	 * HQ.css.convertHexColor("#ff00ff");
	 * HQ.css.convertHexColor("ff00ff");
	 * @return 返回数组形式的10进制颜色
	 */
	convertHexColor: function(color){
		color = /^#/.test(color) ? color.substr(1) : color;
		
		var reColor = new RegExp("\\w{2}", "ig");
		color = color.match(reColor);
		
		if (!color || color.length < 3) {
			return [0, 0, 0]
		}
		
		var r = parseInt(color[0], 16);
		var g = parseInt(color[1], 16);
		var b = parseInt(color[2], 16);
		return [r, g, b];
	},
	
	/**
	 * 获取对象渲染后的样式规则
	 * @param {Object} object
	 * @param {String} prop
	 * @return {String} 结果值
	 * @ignore
	 *
	 getStyle:function(object, prop){
		 function hyphenate(prop){
			 return prop.replace(/[A-Z]/g, function(match){
				 return '-' + match.toLowerCase();
			 });
		 }
		 if (window.getComputedStyle) {
			 return window.getComputedStyle(object, null).getPropertyValue(hyphenate(prop));
		 }
		 if (document.defaultView && document.defaultView.getComputedStyle) {
			 var computedStyle = document.defaultView.getComputedStyle(object, null);
			 if (computedStyle) return computedStyle.getPropertyValue(hyphenate(prop));
			 if (prop == "display") return "none";
			 rt.error("Can't retrieve requested style %q due to a bug in Safari", prop);
		 }
		 if (object.currentStyle) {
			 return object.currentStyle[prop];
		 }
		 return object.style[prop];
	 },
	 */
	/**
	 * 缓存当前页面的样式表,备用
	 * @ignore
	 */
	styleSheets: {},
	
	/**
	 * 通过id号获取样式表
	 * @param {string|number} id 样式表的编号
	 * @return 返回样式表
	 */
	getStyleSheetById: function(id){
		try {
			return document.styleSheets[id] || HQ.dom.get(id).sheet;
		} catch (e) {
			return null
		}
	},
	
	/**
	 * 获取stylesheet的样式规则
	 * @param {string|number} id 样式表的编号
	 * @return 返回样式表规则
	 */
	getRulesBySheet: function(sheetId){
		var ss = HQ.css.getStyleSheetById(sheetId);
		if (ss) {
			return ss.cssRules || ss.rules;
		} else {
			return null
		}
	},
	
	/**
	 * 根据选择器获得样式规则
	 * @param {string} sheetId  id 样式表的编号
	 * @param {string} selector 选择器名称
	 */
	getRuleBySelector: function(sheetId, selector){
		var _ss = this.getStyleSheetById(sheetId);
		if (!_ss.cacheSelector) {
			_ss.cacheSelector = {}
		};
		
		if (_ss) {
			var _rs = _ss.cssRules || _ss.rules;
			var re = new RegExp('^' + selector + '$', "i");
			var _cs = _ss.cacheSelector[selector];
			if (_cs && re.test(_rs[_cs].selectorText)) {
				return _rs[_cs];
			} else {
				for (var i = 0; i < _rs.length; i++) {
					if (re.test(_rs[i].selectorText)) {
						_ss.cacheSelector[selector] = i;
						return _rs[i];
					}
				}
				return null;
			}
		} else {
			return null;
		}
	},
	
	/**
	 * 插入外链样式表
	 * @param {string} url 外部css地址
	 * @return 返回样式表对象
	 */
	insertCSSLink: function(url){
		var cssLink = document.createElement("link");
		cssLink.rel = "stylesheet";
		cssLink.rev = "stylesheet";
		cssLink.type = "text/css";
		cssLink.media = "screen";
		cssLink.href = url;
		
		document.getElementsByTagName("head")[0].appendChild(cssLink);
		return cssLink.sheet || cssLink;
	},
	
	/**
	 * 插入样式
	 * @param {string} sheetId 样式表的编号
	 * @return 返回样式表对象
	 */
	insertStyleSheet: function(sheetId){
		var ss = document.createElement("style");
		ss.id = sheetId;
		document.getElementsByTagName("head")[0].appendChild(cssLink);
		return cssLink.sheet || cssLink;
	},
	
	/**
	 * 删除一份样式表，包含内部style和外部css
	 * @param {string|number} id 样式表的编号
	 */
	removeStyleSheet: function(id){
		var _ss = this.getStyleSheetById(id);
		if (_ss) {
			var own = _ss.owningElement || _ss.ownerNode;
			HQ.dom.removeElement(own);
		}
	},
	
	/**
	 * 是否有指定的样式类名称
	 * @param {Object} elem 指定的HTML元素
	 * @param {String} cname 指定的类名称
	 */
	hasClassName: function(elem, cname){
		return (elem && cname) ? new RegExp('\\b' + trim(cname) + '\\b').test(elem.className) : false;
	},
	
	/**
	 * 交换两种样式类名
	 * @param {Object} elements 指定的HTML元素
	 * @param {String} class1 指定的类名称
	 * @param {String} class2 指定的类名称
	 */
	swapClassName: function(elements, class1, class2){
		function _swap(el, c1, c2){
			if (HQ.css.hasClassName(el, c1)) {
				el.className = el.className.replace(c1, c2);
			} else if (HQ.css.hasClassName(el, c2)) {
				el.className = el.className.replace(c2, c1);
			}
		}
		if (elements.constructor != Array) {
			elements = [elements];
		}
		for (var i = 0, len = elements.length; i < len; i++) {
			_swap(elements[i], class1, class2);
		}
	},
	
	/**
	 * 替换两种样式类名
	 * @param {Object} elements 指定的HTML元素
	 * @param {String} sourceClass 指定的类名称
	 * @param {String} targetClass 指定的类名称
	 */
	replaceClassName: function(elements, sourceClass, targetClass){
		function _replace(el, c1, c2){
			if (HQ.css.hasClassName(el, c1)) {
				el.className = el.className.replace(c1, c2);
			}
		}
		if (elements.constructor != Array) {
			elements = [elements];
		}
		for (var i = 0, len = elements.length; i < len; i++) {
			_replace(elements[i], sourceClass, targetClass);
		}
	},
	
	/**
	 * 增加一个样式类名
	 * @param {Object} elem 指定的HTML元素
	 * @param {Object} cname 指定的类名称
	 */
	addClassName: function(elem, cname){
		if (elem && cname) {
			if (elem.className) {
				if (HQ.css.hasClassName(elem, cname)) {
					return false;
				} else {
					elem.className += ' ' + trim(cname);
					return true;
				}
			} else {
				elem.className = cname;
				return true;
			}
		} else {
			return false;
		}
	},
	
	/**
	 * 除去一个样式类名
	 * @param {Object} elem 指定的HTML元素
	 * @param {String} cname 指定的类名称
	 */
	removeClassName: function(elem, cname){
		if (elem && cname && elem.className) {
			var old = elem.className;
			elem.className = trim(elem.className.replace(new RegExp('\\b' + trim(cname) + '\\b'), ''));
			return elem.className != old;
		} else {
			return false;
		}
	},
	
	/**
	 * 除去一个样式类名
	 * @param {Object} elem 指定的HTML元素
	 * @param {Object} cname 指定的类名称
	 */
	toggleClassName: function(elem, cname){
		var r = HQ.css;
		if (r.hasClassName(elem, cname)) {
			r.removeClassName(elem, cname);
		} else {
			r.addClassName(elem, cname);
		}
	}
	
}

//收集样式正则信息
HQ.css.classNameCache = {};